From 832c698776376df044481c5302ee8e536ad7b7f9 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 23 Mar 2013 00:47:22 -0400 Subject: [PATCH] Implement GInitable in GdkBroadwayDisplayManager Add GInitable implementation and fail the initialisation if it is not possible to set up a broadway server. --- gdk/broadway/gdkdisplaymanager-broadway.c | 50 ++++++++++++++++++++++- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/gdk/broadway/gdkdisplaymanager-broadway.c b/gdk/broadway/gdkdisplaymanager-broadway.c index b445430659..0d2497520a 100644 --- a/gdk/broadway/gdkdisplaymanager-broadway.c +++ b/gdk/broadway/gdkdisplaymanager-broadway.c @@ -22,6 +22,7 @@ #include "config.h" +#include #include "gdkdisplay-broadway.h" #include "gdkbroadwaydisplaymanager.h" #include "gdkprivate-broadway.h" @@ -35,9 +36,53 @@ struct _GdkBroadwayDisplayManager GdkDisplay *default_display; GSList *displays; + + gboolean init_failed; }; -G_DEFINE_TYPE (GdkBroadwayDisplayManager, gdk_broadway_display_manager, GDK_TYPE_DISPLAY_MANAGER) +static void g_initable_iface_init (GInitableIface *iface); + +G_DEFINE_TYPE_WITH_CODE (GdkBroadwayDisplayManager, gdk_broadway_display_manager, GDK_TYPE_DISPLAY_MANAGER, + G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, g_initable_iface_init)) + +static gboolean +gdk_broadway_display_manager_initable_init (GInitable *initable, + GCancellable *cancellable, + GError **error) +{ + const gchar *display_name; + gint port; + GdkBroadwayServer *server; + + display_name = g_getenv ("BROADWAY_DISPLAY"); + + port = 0; + if (display_name != NULL) + { + if (*display_name == ':') + display_name++; + port = strtol(display_name, NULL, 10); + } + if (port == 0) + port = 1; + + server = _gdk_broadway_server_new (port, NULL); + if (server == NULL) + { + GDK_BROADWAY_DISPLAY_MANAGER (initable)->init_failed = TRUE; + return FALSE; + } + + g_object_unref (server); + + return TRUE; +} + +void +g_initable_iface_init (GInitableIface *iface) +{ + iface->init = gdk_broadway_display_manager_initable_init; +} static GdkDisplay * gdk_broadway_display_manager_open_display (GdkDisplayManager *manager, @@ -94,7 +139,8 @@ gdk_broadway_display_manager_init (GdkBroadwayDisplayManager *manager) static void gdk_broadway_display_manager_finalize (GObject *object) { - g_error ("A GdkBroadwayDisplayManager object was finalized. This should not happen"); + if (!GDK_BROADWAY_DISPLAY_MANAGER (object)->init_failed) + g_error ("A GdkBroadwayDisplayManager object was finalized. This should not happen"); G_OBJECT_CLASS (gdk_broadway_display_manager_parent_class)->finalize (object); } -- 2.30.2